Java provides a mechanism to associate arbitrary data values with
named keys via its support for properties. The PropertyManager class
is used to merge existing system properties ("os.name", "user.dir",
etc.) with those specified in an arbitrary number of files and on the
command line. This allows a great amount of flexibility. The program
can store arbitrary key-value pairings for user preferences in a file
with minimal effort. The user can edit this file by hand, use the
program to change the preferences in the files, or override anything
on the command line.

The PropertyManager works using the following policy:

1) Get the existing system properties. This includes those defined by
the Java virtual machine and anything specified on the command line
using the '-D<key>=<value>' directive. (Note: the call to
System.getProperties() returns an actual reference to the system
Properties class. This object reference is used as the master property
list so that code within the same Java virtual machine can access our
customized properties with ease).

2) Create a list of the keys initially gotten in from the system. Any
attempt to set a property is compared against this list. Anything
found in this list will be ignored to prevent these keys from being
overridden by any pairs found in property files or set
programmatically.

3) The PropertyManager class is created by the main application
(ABIDESFE_Application.java). It can be used to get/set properties but
is not needed in most cases.

Sample code in an arbitrary client:

    String reportServer 
	= System.getProperty("ga.abides.reportbreak.hostname" );

    if( reportServer == null )
    {
	reportServer = "my.foo.com";
    }

This code can be influenced then by the following:

1) Adding an option to a properties file that the app already pulls in 
at runtime:

ga.abides.reportbreak.hostname=your.foo.com

2) Using the command line directive

java -Dga.abides.reportbreak.hostname=his.foo.com ABIDESFE_Application

3) Providing hooks for user-customization within the code:

    public void actionPerformed( ActionEvent e )
    {
	.
	.
	.
	propertyManager.setProperty( "ga.abides.reportbreak.hostname",
		rbHostTextField.getText() );
	.
	.
	.	
    }

Note: While arbitrary clients can avoid using the PropertyManager class 
to get values, it should be used for setting values. This allows the
aforementioned policy to be enforced. It is possible to override Java
system properties at will; that is probably not desired behavior.

Also Note: The PropertyManager allows arbitrary objects to be
installed against a given key, not just strings. These don't persist
well at this time, but could be useful in code like this:

    .
    .
    .
    propertyManager.put( "time.i.logged.on", new Date() );
    .
    .
    .


Somewhere else:

    Date onSince = ( Date ) propertyManager.get( "time.i.logged.on" );
